package com.qsl.ssyx.home.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.*;

/**
 * 多线程-ThreadPoolConfig线程池
 */
@Configuration // 配置类
public class ThreadPoolConfig {

    // ThreadPoolConfig线程池
    @Bean
    public ThreadPoolExecutor threadPoolExecutor() {
/**
 *   corePoolSize: 线程池中的常驻核心线程数
 *   maximumPoolSize： 线程池中最大线程数，此值必须大于等于1.
 *   keepAliveTime : 多余的空闲线程的存活时间 当前池中线程数量超过corePoolSize时，当空闲时间达到keepAliveTime时，多余线程会被销毁直到 只剩下corePoolSize个线程为止
 *   unit：keepAliveTime的单位
 *   workQueue：任务队列，被提交但尚未被执行的任务
 *   threadFactory: 线池工厂，一般默认。
 *        DefaultThreadFactory(默认)：用于创建线程，线程的名称以"pool-"开头，后面跟着线程池的编号和线程的序号。
 *        ThreadFactoryBuilder：Google Guava库提供的线程工厂类，可以通过Builder模式进行配置，可以设置线程名称、优先级、是否为守护线程等。
 *        CustomThreadFactory：自定义的线程工厂类，根据需求自行实现ThreadFactory接口的newThread()方法，可以完全自定义线程的创建方式。
 *   handler：拒绝策略，表示当队列满了，并且工作线程大于 等于线程池的最大线程数（maximumPoolSize）时，如何来拒绝 请求执行的runnable的策略
 *       拒绝策略： AbortPolicy(默认):   在任务无法被执行时抛出RejectedExecutionException异常，阻止任务进入线程池。
 */
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                2, 5,
                2,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );
        return threadPoolExecutor;
    }
}
